﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace MetadataBasedConfig.Framework.Validator
{
    public class DataTypePropertyValidator : IConfigInfoPropertyValidator
    {
        public void Validate(ConfigInfoPropertyValidatContext context)
        {
            if (context.IsValid && !context.Canceled && context .Constraint.Key== Constants.PropertyKey_DataType)
            {
                try
                {
                    String dataTypeName = context.Constraint.Value;
                    if (!String.IsNullOrEmpty(dataTypeName))
                    {
                        Type dataType = Type.GetType(dataTypeName);
                        if (dataType != null)
                        {
                            if (context.SourceType == SourceType.DB)
                            {
                                TypeConverter typeConverter = TypeDescriptor.GetConverter(dataType);
                                if (typeConverter.CanConvertFrom(typeof(string)))
                                {
                                    string sourceValue = (context.SourceValue ?? String.Empty).ToString();
                                    context.TargetValue = typeConverter.ConvertFromString(sourceValue);
                                    context.IsValid = true;
                                    return;
                                }
                            }
                            else
                            {
                                if (context.SourceValue.GetType() == dataType)
                                {
                                    context.TargetValue = context.SourceValue.ToString();
                                    context.IsValid = true;
                                    return;
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                }                     
            }
            else
            {
                context.IsValid = false;
            }

            context.IsValid = false;
            context.TargetValue = null;
            context.Canceled = true;
        }
    }
}
